# coding: utf-8

from .models import VirtualNumber, QueryCallNumberRecord
from .constant import VirtualNumberValid


def get_customer_real_mobile(mobile):
    """
    add by zhouhl 2018-03-12
    根据虚拟号，查询用户真实号码，仅供七陌报单系统，即seven_moor模块使用！！！

    NOTE by zhouhl
    VirtualNumber : 虚拟号绑定关系
    QueryCallNumberRecord : 查询虚拟号关系的历史记录

    1. 无论使用虚拟号呼入or呼出，VirtualNumber 中的 tel_b 必定为空，即 axn 模式
    2. 使用虚拟号呼出时（如拉新），VirtualNumber.tel_a 即为客户真实号码
    3. 客户拨打虚拟号，呼入至客服系统时，VirtualNumber.tel_a 应该七陌的固话号，
        应继续查询 QueryCallNumberRecord，且 return_tel 为七陌固话号的记录，
        此时 QueryCallNumberRecord.caller 即为客户真实号码

    对应逻辑
    1. 查询 VirtualNumber 是否存在有效的 axn 关系
    2. 如果存在有效关系：
        2.1. tel_a 不是七陌的固话号，此时 tel_a 就是客户的真实号码
        2.2. tel_a 是七陌的固话号
            2.2.1. 查询 QueryCallNumberRecord，且 return_tel 为七陌固话号的记录，QueryCallNumberRecord.caller 即为客户真实号码
    4. 返回结果
    """

    from app.op.constant import SEMGroup
    if not mobile:
        return mobile

    real_mobile = mobile
    seven_moor_numbers = SEMGroup.values()
    tmp_val_num = VirtualNumber.get_by_args(
        tel_x=mobile,
        tel_b='',
        valid=VirtualNumberValid.VALID.value,
        for_sms=False,
        reserved=False,
    )
    if tmp_val_num:
        if tmp_val_num.tel_a not in seven_moor_numbers:
            # 虚拟号外呼
            real_mobile = tmp_val_num.tel_a
        else:
            # 客户通过虚拟号呼入客户系统
            tmp_record = QueryCallNumberRecord.query.filter(
                QueryCallNumberRecord.called == mobile,
                QueryCallNumberRecord.return_tel.in_(seven_moor_numbers)
            ).order_by(
                QueryCallNumberRecord.id.desc()
            ).first()
            if tmp_record:
                real_mobile = tmp_record.caller

    return real_mobile
